#include "../source/server.hpp"

// void HandlerClose(Channel *channel)
// {
//     DBG_LOG("close: %d", channel->Fd());
//     channel->Remove();  // 删除对应的事件管理对象channel
//     delete channel;
// }

// void HandlerRead(Channel *channel)
// {
//     int fd = channel->Fd();
//     char buf[1024] = {0};
//     int ret = recv(fd, buf, 1023, 0);
//     if(ret <= 0)    //读取失败时，直接调用HandlerClose
//     {
//         return HandlerClose(channel);
//     }
//     DBG_LOG("%s", buf);
//     channel->EnableWrite();     //启动可写事件,因为这里要回写过去 服务器这里会先读后写，所以要先开启可读监控
// }

// void HandlerWrite(Channel *channel)
// {
//     int fd = channel->Fd();
//     const char *data = "天气还不错！！";
//     int ret = send(fd, data, strlen(data), 0);
//     if(ret < 0)     // 发送失败，直接关闭和释放
//     {   
//         return HandlerClose(channel);
//     }
//     channel->DisableWrite();    //关闭写监控
// }

// void HandlerError(Channel *channel)
// {
//     return HandlerClose(channel);
// }

// void HandlerEvent(EventLoop *loop, Channel *channel, uint64_t timerid)
// {   
//     // 对活跃的连接，进行其事件任务的活跃度刷新
//     // 注意，刷新的是任务,所以要传递的是任务ID
//     loop->TimerRefresh(timerid);
// }

std::unordered_map<uint64_t, PtrConnection> _conns;
uint64_t conn_id = 0;
EventLoop base_loop;
std::vector<LoopThread> threads(2);
int next_loop = 0;
LoopThreadPool *loop_pool;

void ConnectionDestroy(const PtrConnection &conn)
{
    _conns.erase(conn->Id());
}

void OnConnected(const PtrConnection &conn)
{
    DBG_LOG("NEW CONNECTION: %p", conn.get());
}

void OnMessage(const PtrConnection &conn, Buffer *buf)
{
    DBG_LOG("%s", buf->ReadPosition());
    buf->MoveReadOffset(buf->ReadAbleSize());
    std::string str = "Hello world";
    conn->Send(str.c_str(), str.size());
}

void NewConnection(int fd)
{
    conn_id++;
    PtrConnection conn(new Connection(loop_pool->NextLoop() , conn_id, fd));

    conn->SetMessageCallback(std::bind(OnMessage, std::placeholders::_1, std::placeholders::_2));      
    conn->SetSrvClosedCallback(std::bind(ConnectionDestroy, std::placeholders::_1));
    conn->SetConnectedCallback(std::bind(OnConnected, std::placeholders::_1));

    conn->EnableInactiveRelease(10); // 启动非活跃超时销毁
    conn->Established();             // 就绪初始化
    _conns.insert(std::make_pair(conn_id, conn));

    DBG_LOG("Main ------");
}

/*
    // 非活跃连接的超时释放操作 -- 某连接若10s未有事件响应那么就释放该连接
    // 针对某连接10s内有事件响应的，那么要刷新该连接的活跃的，确保其可以存在，而不是某连接正在工作而突然因为错误地被
    // 判别未非活跃连接而导致被关闭
    // 因此，在任何事件的响应模块，对于有事件响应的连接，要进行该连接对应的事件任务的活跃度刷新操作
    loop->TimerAdd(timerid, 10, std::bind(HandlerClose, channel));  // 定时销毁任务，必须要设置在启动读事件设置之前
    // 有可能在启动事件监控后，有了事件，但是事件对应的任务还没用就绪               --TODO...
    channel->EnableRead();
*/

int main()
{
    loop_pool = new LoopThreadPool(&base_loop);
    loop_pool->SetThreadCount(2);
    loop_pool->Create();
    Acceptor acceptor(&base_loop, 8500);
    acceptor.SetAcceptCallback(std::bind(NewConnection, std::placeholders::_1));
    acceptor.Listen();
    base_loop.Start();

    return 0;
}